package com.stars.common.date;

import org.springframework.util.StringUtils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 
 * @description 时间工具类
 * @author Alex
 * @time 2016年10月1日下午5:35:16
 * @version 1.0
 */
public class DateUtil {

	public static final String yyyy_MM_dd_HH_mm_ss = "yyyy-MM-dd HH:mm:ss";

	public static final String yyyy_MM_dd = "yyyy-MM-dd";

	public static final String yyMMddHHmmss = "yyMMddHHmmss";
	
	public static final String yyyyMMdd = "yyyyMMdd";
	
	public static final String HHmmss = "HHmmss";
	
	public static final String yyyyMMddHHmmss = "yyyyMMddHHmmss";

	public static void main(String[] args) {
		// 时间戳Long转换Date类型
		// System.out.println(DateUtil.longToDate(System.currentTimeMillis()));
		// date转换String字符串
		// System.out.println(DateUtil.dateFormat(yyyy_MM_dd_HH_mm_ss).format(DateUtil.longToDate(System.currentTimeMillis())));
		// String转时间戳Long ,注意String字符串和类型要匹配
		// System.out.println(longToString(System.currentTimeMillis(),yyyy_MM_dd_HH_mm_ss));
		// String转时间戳Long ,注意String字符串和类型要匹配
		// System.out.println(dateToLong(new Date(), yyyy_MM_dd));
		// String转时间戳Long ,注意String字符串和类型要匹配
		// System.out.println(strngToLong("2016-10-10", yyyy_MM_dd));
		// String转换Date,注意String字符串和类型要匹配
		// System.out.println(stringToDate("2016-10-10", yyyy_MM_dd));
		// 获取当前时间戳(精确到秒)
		// System.out.println(getNewTime());
		// 获取当前时间,格式=yyMMddHHmmss
		// System.out.println("xxx="+getYY_MM_DD_HH_MM_SS());
		// 获取当天时间戳(精确到天)
//		 System.out.println(getDayTime());
//		 System.out.println(getNewTimeStr(yyyy_MM_dd_HH_mm_ss));
//		 SimpleDateFormat sdf = new SimpleDateFormat(yyyy_MM_dd_HH_mm_ss);
//		 System.out.println(sdf.format(new Date()));
	}

	/**
	 * 
	 * @description 获取当前时间戳(精确到秒)
	 * @author Alex
	 * @return
	 */
	public static Long getNewTime() {
		return System.currentTimeMillis() / 1000;
	}

	/**
	 * 
	 * @description 获取当天时间戳(精确到天)
	 * @author alex
	 * @date 2016年12月22日 上午11:03:18
	 * @version 1.0.0
	 * @return
	 */
	public static Long getDayTime() {
		return strngToLong(getNewTimeStr(yyyy_MM_dd), yyyy_MM_dd);
	}

	/**
	 * 
	 * @description 获取当前时间字符串(根据传入的type决定)：
	 * @author Alex
	 * @return
	 */
	public static String getNewTimeStr(String type) {
		return dateFormat(type).format(new Date());
	}

	/**
	 * 
	 * @description String转换Date,注意String字符串和类型要匹配
	 * @author Alex
	 * @param string
	 *            需要转换的时间字符串
	 * @param type
	 *            转换的类型
	 * @return
	 */
	public static Date stringToDate(String string, String type) {
		try {
			return StringUtils.isEmpty(string) ? null : dateFormat(type).parse(string);
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 
	 * @description Date转换时间戳Long
	 * @author Alex
	 * @param date
	 *            需要转换的date
	 * @param type
	 *            转换的类型
	 * @return
	 */
	public static Long dateToLong(Date date, String type) {
		try {
			String string = dateFormat(type).format(date);
			/** getTime()取的是毫秒数，所以要除1000 **/
			return dateFormat(type).parse(string).getTime() / 1000;
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 
	 * @description String转时间戳Long ,注意String字符串和类型要匹配
	 * @author Alex
	 * @param string
	 *            需要转换的时间字符串
	 * @param type
	 *            转换的类型
	 * @return
	 */
	public static Long strngToLong(String string, String type) {
		return null != string ? dateToLong(stringToDate(string, type), type) : null;

	}

	/**
	 * 
	 * @description 时间戳Long转换Date类型
	 * @author alex
	 * @date 2017年1月13日 上午11:11:09
	 * @version 1.0.0
	 * @param lon	10位数的long
	 * @return
	 */
	public static Date longToDate(Long lon) {
		/** 判断lon的长度,如果是10位数，表示为秒级别lon,则*1000 **/
		if(lon.toString().length()==10){
			return new Date(lon*1000);
		}
		return lon > 0 ? new Date(lon) : null;
	}

	/**
	 * 
	 * @description Date转换String
	 * @author Alex
	 * @param date
	 *            需要转换的时间类型
	 * @param type
	 *            时间格式类型
	 * @return
	 */
	public static String dateToString(Date date, String type) {
		return null != date ? DateUtil.dateFormat(type).format(date) : null;
	}

	/**
	 * 
	 * @description 时间戳Long转换日期字符串
	 * @author Alex
	 * @param lon
	 *            时间戳
	 * @param type
	 *            转换成日期字符串的类型，如:yyyy-MM-dd
	 * @return
	 */
	public static String longToString(Long lon, String type) {
		return lon > 0 ? dateToString(longToDate(lon), type) : null;
	}

	/**
	 * 将时间戳转换为时间字符串
	 * 
	 * @param timestamp
	 *            时间戳
	 * @param type
	 *            格式
	 * @return 时间字符串
	 */
	public static String timestampToDateString(Long timestamp, String type) {
		SimpleDateFormat sdf = new SimpleDateFormat(type);
		return sdf.format(longToDate(timestamp));
	}

	/**
	 * 将时间字符串转为Date类型
	 * 
	 * @param dateString
	 *            时间字符串
	 * @param type
	 *            格式
	 * @return 正确时返回Date;错误时，返回null
	 */
	public static Date dateStringToDate(String dateString, String type) {
		SimpleDateFormat format = new SimpleDateFormat(type);
		try {
			return format.parse(dateString);
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 将时间字符串转成时间戳(精确到秒)
	 * 
	 * @param dateString
	 *            时间字符串
	 * @param type
	 *            格式
	 * @return 正确，返回时间戳；否则，返回-1
	 */
	public static Long dateStringToTimestamp(String dateString, String type) {
		Date date = dateStringToDate(dateString, type);
		return null != date ? date.getTime() / 1000 : -1;
	}

	/**
	 * 
	 * @description 实例化SimpleDateFormat
	 * @author Alex
	 * @param type
	 * @return SimpleDateFormat
	 */
	public static SimpleDateFormat dateFormat(String type) {
		return new SimpleDateFormat(type);
	}
	
	/**
	 * @description 精确到毫秒
	 * @author huangz
	 * @date 2017年6月2日  上午9:44:22
	 * @version 1.0.0
	 */
	public static String getCurrenTime(){
		Calendar cal = Calendar.getInstance(); 
		Date date = cal.getTime(); 
		SimpleDateFormat sdFormat = new SimpleDateFormat("yyyyMMddhhmmssSSS"); 
		String myTime = sdFormat.format(date);
		return myTime;
	}
}
